﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Globalization;

namespace BusinessLogicLayer
{
    public class ThoiGianLam
    {
        public double _GioLam { get; set; }
        public double _GioTangCa { get; set; }
        public double _HeSoTC { get; set; }
    }
    public class TinhThoiGian
    {
        ThamSoBLL tsBLL = new ThamSoBLL();
        NgayNghiBLL nn = new NgayNghiBLL();

        public ThoiGianLam TinhTG(DateTime gioden, DateTime giove, int _maNV)
        {
            //int GioLam, GioTangCa;

            //================== Khai Báo Thời Gian Làm =========================
            ThoiGianLam tg = new ThoiGianLam();



            DateTime today = gioden;

            //ThoiGianLam tg = new ThoiGianLam();

            //============================= Tổng thời gian làm việc =================================
            Double Tongtg;

            //Thời gian về buổi sáng
            string StringtgVeSang = today.ToShortDateString() + " " + tsBLL.LayGiaTri("TGVeSang");
            DateTime tgVeSang = Convert.ToDateTime(StringtgVeSang);

            //Thời gian đến buổi chiều
            DateTime tgDenChieu = tgVeSang + ConvertToTimeSpan(tsBLL.LayGiaTri("TGTrua"));

            //nếu người làm đếm trước giờ nghỉ trưa
            if (gioden <= tgVeSang && giove >= tgDenChieu)
            {
                //Thời điểm về - Thời đến đến - Thời gian nghỉ trưa
                TimeSpan TongtgTS = Convert.ToDateTime(giove) - Convert.ToDateTime(gioden);
                Tongtg = Convert.ToDouble(TongtgTS.TotalHours) - Convert.ToDouble(tsBLL.LayGiaTri("TGTrua"));
            }
            //nếu người làm đến trong giờ nghĩ trưa
            //else if (gioden > tgDenChieu && giove > tgDenChieu)
            //{
            //    //Thời điểm về - Thời gian đến buổi chiều
            //    TimeSpan TongtgTS = Convert.ToDateTime(giove) - tgDenChieu;
            //    Tongtg = Convert.ToDouble(TongtgTS.TotalHours);
            //}
            else
            {
                TimeSpan TongtgTS = Convert.ToDateTime(giove) - Convert.ToDateTime(gioden);
                Tongtg = Convert.ToDouble(TongtgTS.TotalHours);
            }
            //=====================================================================================

            //Kiểm tra trạng thái tăng ca
            int ttTangCa = int.Parse(tsBLL.LayGiaTri("TTTangCa"));

            if (ttTangCa == 1) //nếu trạng thái tăng ca là bình thường (mặc định tất cả các ngày đều tăng ca)
            {
                //TinhTangCa# 
                tg._GioTangCa = TinhTangCa(gioden, giove, tgVeSang, tgDenChieu, Tongtg);
            }
            else if (ttTangCa == 2) //nếu trạng thái tăng ca là tùy chỉnh (tăng ca theo ngày- theo phòng ban)
            {
                //Kiểm tra hôm nay có tăng ca không
                LichTangCaBLL tc = new LichTangCaBLL();
                if (tc.KiemTraTangCa(today, _maNV) == true)
                {
                    //có tăng ca -> tính tăng ca
                    tg._GioTangCa = TinhTangCa(gioden, giove, tgVeSang, tgDenChieu, Tongtg);
                }
                else
                {
                    //không tăng ca -> tính không
                    tg._GioTangCa = 0;
                }
            }
            else // trạng thái tăng ca là không (không tính tăng ca)
            {
                //Không tính tăng ca.
                tg._GioTangCa = 0;
            }

            //================================== Tính Thời Gian Làm Việc ========================================

            //Lấy hệ số tăng ca
            if (today.DayOfWeek.ToString() == "Sunday")
                tg._HeSoTC = Convert.ToDouble(tsBLL.LayGiaTri("HSTCCN"));
            else if (nn.KiemTraTonTai(today) == true)
                tg._HeSoTC = Convert.ToDouble(tsBLL.LayGiaTri("HSTCNghi"));
            else
                tg._HeSoTC = Convert.ToDouble(tsBLL.LayGiaTri("HSTCThuong"));

            tg._GioLam = Tongtg - tg._GioTangCa;

            return tg;
        }

        protected Double TinhTangCa(DateTime _gioden, DateTime _giove, DateTime _tgVeSang, DateTime _tgDenChieu, double _tongtg)
        {
            

            DateTime today = _gioden;
            double _giotangca;

            string thu = today.DayOfWeek.ToString();// lấy thứ của ngày hôm nay

            //Lấy thời gian về tiêu chuẩn
            string StringtgVe = today.ToShortDateString() + " " + tsBLL.LayGiaTri("TGVe");
            DateTime tgVeTC = Convert.ToDateTime(StringtgVe);

            if (nn.KiemTraTonTai(today) == true)//Nếu hôm nay là ngày nghỉ
            {
                //Giờ tăng ca = Tổng giờ làm
                _giotangca = _tongtg;
                return _giotangca;
            }
            if (thu.Trim() == "Sunday")//nếu hôm nay là chủ nhật
            {
                //Giờ tăng ca = Tổng giờ làm
                _giotangca = _tongtg;
                return _giotangca;
            }
            else if (thu.Trim() == "Saturday")//nếu hôm nay là thứ 7
            {
                //kiểm tra thứ 7 làm nguyên ngày hay nữa ngày
                int ttT7 = int.Parse(tsBLL.LayGiaTri("TTLVT7"));

                if (ttT7 == 1) //Nếu làm việc nữa ngày
                {
                    //Tính tăng ca từ chiều đến tối
                    //Người làm đến trước giờ bắt đầu làm buổi chiều.
                    if (_gioden <= _tgDenChieu && _giove > _tgDenChieu)
                    {
                        string tdNghiTrua = today.ToShortDateString() + " " + tsBLL.LayGiaTri("TGVeSang");
                        int tgNghiTrua = int.Parse(tsBLL.LayGiaTri("TGTrua"));
                        _giotangca = Convert.ToDouble((_giove - Convert.ToDateTime(tdNghiTrua)).TotalHours) - tgNghiTrua;

                        return _giotangca;
                    }
                    else if (_gioden > _tgDenChieu) //trường hợp người làm đến sau giờ bắt đầu làm buổi chiều.
                    {
                        _giotangca = _tongtg;
                        return _giotangca;
                    }
                    else
                        return 0;

                }
                else if (ttT7 == 2)//làm việc cả ngày
                {
                    
                    if (_gioden <= tgVeTC)
                    {
                        //Đối với người làm đến trước giờ về tiêu chuẩn
                        //Tính Tăng Ca Sau Giờ về Chính Thức
                        _giotangca = Convert.ToDouble((_giove - tgVeTC).TotalHours);
                        return _giotangca;
                    }
                    else
                    {
                        //Đối với người làm đến sau giờ tiêu chuẩn
                        //Thời gian Tăng Ca = Thời Gian làm việc
                        _giotangca = _tongtg;
                        return _giotangca;
                    }
                }
                else//không làm việc
                {
                    //toàn bộ thời gian tính tăng ca
                    _giotangca = _tongtg;
                    return _giotangca;
                }
            }
            else //Hôm nay là ngày thường
            {
                if (_gioden <= tgVeTC && _giove > tgVeTC)
                {
                    //Đối với người làm đến trước giờ về tiêu chuẩn
                    //Tính Tăng Ca Sau Giờ về Chính Thức
                    _giotangca = Convert.ToDouble((_giove - tgVeTC).TotalHours);
                    return _giotangca;
                }
                else if (_gioden >= tgVeTC)
                {
                    //Đối với người làm đến sau giờ tiêu chuẩn
                    //Thời gian Tăng Ca = Thời Gian làm việc
                    _giotangca = _tongtg;
                    return _giotangca;
                }
                else
                {
                    return 0;
                }
            }

        }

        protected TimeSpan ConvertToTimeSpan(string x)
        {
            float a = float.Parse(x);
            int b = (int)a;
            int c = (int)((a - b) * 60);
            string d = b.ToString() + ":" + c.ToString() + ":" + "00";
            return TimeSpan.Parse(d);
        }

        public double LayHSTangCa(DateTime ngay, int Manv)
        {
            //Kiểm tra trạng thái tăng ca
            int ttTangCa = int.Parse(tsBLL.LayGiaTri("TTTangCa"));

            int flat = 0;

            if (ttTangCa == 1) //nếu trạng thái tăng ca là bình thường (mặc định tất cả các ngày đều tăng ca)
            {
                //TinhTangCa# 
                flat = 1;
            }
            else if (ttTangCa == 2) //nếu trạng thái tăng ca là tùy chỉnh (tăng ca theo ngày- theo phòng ban)
            {
                //Kiểm tra hôm nay có tăng ca không
                LichTangCaBLL tc = new LichTangCaBLL();
                if (tc.KiemTraTangCa(ngay, Manv) == true)
                {
                    flat = 1;
                }
                else
                {
                    //không tăng ca -> tính không
                    flat = 0;
                }
            }
            else // trạng thái tăng ca là không (không tính tăng ca)
            {
                //Không tính tăng ca.
                flat = 0;
            }

            //Lấy hệ số tăng ca
            if (flat == 1)
            {
                if (ngay.DayOfWeek.ToString() == "Sunday")
                    return Convert.ToDouble(tsBLL.LayGiaTri("HSTCCN"));
                else if (nn.KiemTraTonTai(ngay) == true)
                    return Convert.ToDouble(tsBLL.LayGiaTri("HSTCNghi"));
                else
                    return Convert.ToDouble(tsBLL.LayGiaTri("HSTCThuong"));
            }
            else
            {
                return 0;
            }
        }
    }
}
